package modelo.controlAereo;

import java.awt.geom.Area;
import modelo.Trayectoria.ListaDeSegmentos;
import modelo.Orientacion.AreaRectangular;
import modelo.Orientacion.Posicion;
import modelo.Orientacion.Direccion;
import modelo.Escenografia.Pista;
import modelo.Trayectoria.ListaParaNoDetenibles;


public abstract class Aeronave implements Movible{
	
	protected AreaRectangular areaDelAeronave;
	protected ListaDeSegmentos trayectorias;

	//Se crea una instancia de aeronave con la posici�n y direccion inicial y un n�mero �nico
	//Pre: -
	//Pos: Se crea una instancia de Aeronave.
	public Aeronave(Posicion posicionInicial, Direccion direccionInicial, int velocidad){
		this.trayectorias = this.crearListaDeSegmentos(posicionInicial, direccionInicial, velocidad);
		this.areaDelAeronave = new AreaRectangular(40,40);
	}

        protected ListaDeSegmentos crearListaDeSegmentos(Posicion posicionInicial, Direccion direccionInicial, int velocidad){
        /*PreCondicion: la aeronave debe estar creada
          PostCondicion: devuelve la lista de segmentos que corresponde*/
            return new ListaParaNoDetenibles(posicionInicial, direccionInicial, velocidad);
        }

	//A partir de una posici�n 'fin' se agrega una nueva trayectoria por donde se mover� la aeronave.
	//Precondici�n: Se debe haber creado una instancia de Aeronave
	//Poscondici�n: Aumenta la cantidad de elementos de la ListaDeSegmentos
	public void agregarTrayectoria(Posicion fin) {
		this.trayectorias.agregarSegmento(fin);
	}

        public AreaRectangular obtenerArea(){
		return this.areaDelAeronave;
	}

	public Posicion obtenerPosicion() {
		return this.trayectorias.devolverPosicionActual() ;
	}

	public void mover() {
		this.trayectorias.avanzar();
	}
	
	public boolean chocaConMovible(Movible otroMovible) {
            AreaRectangular areaR = otroMovible.obtenerArea();
            Area area = areaR.getArea(otroMovible.obtenerPosicion());
            return (this.areaDelAeronave.estasSobreEstaArea(this.obtenerPosicion(), area));
	}

        public void chocarConLosLimites(){
            trayectorias.invertirTrayectoria();
        }

        public ListaDeSegmentos devolverTrayectoria(){
            return trayectorias;
        }

	public abstract boolean puedeAterrizarEn(Pista unaPista);
        /*PreCondicion: la aeronave debe estar creada
          PostCondicion: devuelve true si la aeronave puede aterrizar en la pista pasada por parametro,
          en caso contrario devuelve false*/

	public Direccion getDireccion(){
        /*PreCondicion: la aeronave debe estar creada
          PostCondicion: devuelve la direccion actual de la trayectoria de la aeronave*/
            return trayectorias.devolverLaDireccionActual();
	}

        public boolean sePuedeCambiarLaTrayectoria() {
            return true;
        }
        
}
